<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <title>算术与进制</title>
    <meta charset="utf-8" />
    <link rel="stylesheet" type="text/css" href="../../css/note.css" />
</head>
<body>

<p class="example">
	<b>小数化分数</b>
	只考虑纯循环小数. 以循环节中的数字为分子, 相同位数的数字 9 为分母,
	再约分就得到结果. 例如
	<span class="formula">
		`0. dot 3 = 3/9 = 1/3`,
		`quad 0. dot 0 dot 9 = 09/99 = 1/11`,<br/>
		`0. dot 1 4285 dot 7 = 142857/999999 = 1/7`,
		`quad 0. dot 0 7692 dot 3 = 076923/999999 = 1/13`.
	</span>
</p>

<p class="example">
	<b>分数化小数</b>
	当然可以直接作除法. 也可以利用熟记的简单分数的值 (见下表) 做快速计算:
	<span class="formula">
		`1/12 = 5/60 = 0.08 dot 3`,
		`quad 1/15 = 6/90 = 0.0 dot 6`,
		`quad 1/18 = 5/90 = 0.0 dot 5`.
	</span>
	此外, 由原根的知识知道, 1/17 的循环节有 16 位, 1/19 的循环节有
	18 位, 等等. 100 以内满足 1/n 的循环节恰有 n-1 位的数字 n 有 7, 17,
	19, 23, 29, 47, 59, 61, 97.
</p>

<table class="col2">
<tr>
	<td>1/2</td>
	<td>0.5</td>
	<td>3/8</td>
	<td>0.375</td>
	<td>1/7</td>
	<td>`0.dot 1 4285 dot 7`</td>
	<td>5/7</td>
	<td>`0.dot 7 1428 dot 5`</td>
</tr>
<tr>
	<td>1/4</td>
	<td>0.25</td>
	<td>5/8</td>
	<td>0.625</td>
	<td>2/7</td>
	<td>`0.dot 2 8571 dot 4`</td>
	<td>6/7</td>
	<td>`0.dot 8 5714 dot 2`</td>
</tr>
<tr>
	<td>3/4</td>
	<td>0.75</td>
	<td>7/8</td>
	<td>0.875</td>
	<td>3/7</td>
	<td>`0.dot 4 2857 dot 1`</td>
	<td>1/9</td>
	<td>`0. dot 1`</td>
</tr>
<tr>
	<td>1/8</td>
	<td>0.125</td>
	<td>1/16</td>
	<td>0.0625</td>
	<td>4/7</td>
	<td>`0.dot 5 7142 dot 8`</td>
	<td>1/11</td>
	<td>`0. dot 0 dot 9`</td>
</tr>
</table>

<p class="example">
	<b>口算开平方</b>
	利用微分近似 `sqrt(1+x) ~ 1 + x/2` (`x to 0`) 来计算平方根.
	如计算 `sqrt n`, 可先取一个接近 `n` 的完全平方数 `m^2`,
	记 `x = n // m^2 - 1`, 则
	<span class="formula">
		`sqrt n = m sqrt (n / m^2)`
		`= m sqrt(1+x)`
		`~~ m (1 + x/2)`
		`= m + (n - m^2) / (2 m)`.
	</span>
	如,
	<span class="formula">
		`sqrt(97) ~~ 10 - 3/(2 xx 10) = 9.85`,<br/>
		`sqrt "e" ~~ sqrt(2.72) ~~ 1.6 + (0.16)/(2 xx 1.6) = 1.65`,<br/>
		`sqrt pi ~~ sqrt(3.14) ~~ 1.8 - (0.1)/(2 xx 1.8) = 1.77 dot 2`.
	</span>
	可以用计算器验证上面各式的精度.
</p>

<p class="example">
  <b>用 Padé 近似开方</b> `x` 充分小时,
  <span class="formula">
    `(1+x)^a ~~ (2+(1+a)x)/(2+(1-a)x)`,<br>
    `sqrt(1+x) ~~ (4+3x)/(4+x)`,<br>
    `root 3 (1+x) ~~ (3+2x)/(3+x)`.
  </span>
  如 `root 3 2 ~~ (3+2)/(3+1) = 5/4`;
  进一步改进为
  <span class="formula">
    `root 3 2 = 5/4 root 3 (128/125)`
    `~~ 5/4 (3+6/125)/(3+3/125)`
    `= 5/4 * 127/126`
    `~~ 1.25992`.
  </span>
</p>

<p class="example">
	<b>笔算开平方</b> 求 `root 4 1.33`.
</p>

<ol class="solution">
	<li>把求四次方根分解为开两次平方. 问题化为求 `|__ sqrt x __|`,
		其中 `x = 13300`.</li>
	<li>先设 `x = 10a_1 + b_1`, `0 le b_1 le 9`.
		因为 `b_1^2 lt 100`, 有 `a_1 = |__ sqrt 133 __|`.
		又设 `a_1 = 10a_2 + b_2`, `0 le b_2 le 9`.
		同理 `a_2 = |__ sqrt 1 __| = 1`.
	</li>
	<li>由
		<span class="formula">
			`(10a_2 + b_2)^2 le 133`
			`rArr (20a_2 + b_2)b_2 le 33`
			`rArr b_2 le 1`,
		</span>
		`b_2` 应当尽可能取大, 所以 `b_2 = 1`, `a_1 = 11`.
		同理
		<span class="formula">
			`(10a_1 + b_1)^2 le 13300`
			`rArr (20a_1 + b_1)b_1 le 1200`
			`rArr b_1 le 5`.
		</span>
	</li>
</ol>

<pre>
# 笔算开平方的竖式表示    # 同理
     1  1  5                 1  0  7  2
    --------                -----------
 1 / 1 33 00             1 / 1 15 00 00
     1                       1
      ---                     ---
  21 / 33                 20 / 15
       21                       0
      ------                  -------
 225 / 12 00             207 / 15 00
       11 25                   14 49
                                 ------
                           2142 / 51 00
                                  42 84
# 每步把当前答案的 20 倍加上一位数字, 再与这位数字相乘,
# 要求不超过当前余数, 如此做下去.
</pre>

<p class="example">
  <b>对数的估算</b>
  首先记住 `ln 2 ~~ 0.693`, `ln 3 ~~ 1.099` 等,
  然后利用 <a href="../analysis/5.html#5-6">Padé 近似</a> `ln(1+1/x) ~~ 2/(2x+1)` (`x` 充分大). 例如
  <span class="formula">
    `ln 5 = ln 4 + ln(1+1/4)`
    `~~ 2 ln 2 + 2/(2*4+1)`
    `~~ 1.608`,<br>
    `ln 103 = ln 128 - ln(1+25/103)`
    `~~ 7 ln 2 - 2/(2*103//25 + 1)`
    `~~ 4.635`.
  </span>
  计算器: log(5) = 1.609438, log(103) = 4.634729.
</p>

<ol class="example">
	<b>进制转换</b>
	将十进制数分别转换为二进制和十六进制;
	将二进制数和十六进制数化为十进制.
</ol>

<ol class="solution">
	<li>十进制数化为二进制: 以 2500 为例,
		反复把 2500 除以 2, 将余数写在右边, 商写在下面.
<pre>
2500 0
1250 0
 625 1
 312 0
 156 0
  78 0
  39 1
  19 1
   9 1
   4 0
   2 0
   1 1
</pre>
		从下到上读出各个余数, 即为二进制数: 1001 1100 0100
	</li>
	<li>十进制数化为十六进制, 也可以采用反复除以 16, 再倒序读出余数的做法,
		但一般是先化为二进制数, 再从低位起按每 4 位一组划分,
		利用二进制与十六进制对照表进行转换, 得到答案 0x9c4.
		十六进制与二进制之间的转换是容易的, 在实际应用中,
		十六进制常作为二进制的缩写而存在.
	</li>
	<li>将二进制数 `b_n b_(n-1) cdots b_1 b_0` 化为十进制, 只需计算
		`sum_(i=0)^n b_i 2^i` 即可. 为此可以熟记常见的 2
		的正整数幂的十进制写法.
	</li>
	<li>将十六进制数 `h_n h_(n-1) cdots h_1 h_0` 化为十进制, 可以直接计算
		`sum_(i=0)^n h_i 16^i`, 也可以先化为二进制数,
		再按 3. 的方法化为十进制.
	</li>
</ol>

<table class="col2">
	<caption>二进制与十六进制对照表</caption>
	<tr>
		<td>0000</td>
		<td>0x0</td>
		<td>0100</td>
		<td>0x4</td>
		<td>1000</td>
		<td>0x8</td>
		<td>1100</td>
		<td>0xc</td>
	</tr>
	<tr>
		<td>0001</td>
		<td>0x1</td>
		<td>0101</td>
		<td>0x5</td>
		<td>1001</td>
		<td>0x9</td>
		<td>1101</td>
		<td>0xd</td>
	</tr>
	<tr>
		<td>0010</td>
		<td>0x2</td>
		<td>0110</td>
		<td>0x6</td>
		<td>1010</td>
		<td>0xa</td>
		<td>1110</td>
		<td>0xe</td>
	</tr>
	<tr>
		<td>0011</td>
		<td>0x3</td>
		<td>0111</td>
		<td>0x7</td>
		<td>1011</td>
		<td>0xb</td>
		<td>1111</td>
		<td>0xf</td>
	</tr>
</table>

<table class="col2">
	<caption>2 的正整数幂</caption>
	<tr>
		<td>`2^1`</td>
		<td>2</td>
		<td>`2^6`</td>
		<td>64</td>
		<td>`2^16`</td>
		<td>65536</td>
	</tr>
	<tr>
		<td>`2^2`</td>
		<td>4</td>
		<td>`2^7`</td>
		<td>128</td>
		<td>`2^20`</td>
		<td>1048576</td>
	</tr>
	<tr>
		<td>`2^3`</td>
		<td>8</td>
		<td>`2^8`</td>
		<td>256</td>
		<td>`2^24`</td>
		<td>16777216</td>
	</tr>
	<tr>
		<td>`2^4`</td>
		<td>16</td>
		<td>`2^9`</td>
		<td>512</td>
		<td>`2^30`</td>
		<td>1073741824</td>
	</tr>
	<tr>
		<td>`2^5`</td>
		<td>32</td>
		<td>`2^10`</td>
		<td>1024</td>
		<td>`2^32`</td>
		<td>4294967296</td>
	</tr>
</table>

<script src="../../js/note.js?type=math"></script>
</body>
</html>
